package com.lovi.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/*
练习1:通过反射修改私有成员变量
定义PrivateTest类，有私有name属性，并且属性值为hellokitty
提供getName的公有方法
创建PrivateTest的类，利用Class类得到私有的name属性，修改私有的name属性值
并调用getName()的方法打印name属性值f
 */
public class Test02_1 {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, NoSuchFieldException, InvocationTargetException {
        //1. 获取当前class
        Class<?> cls = Class.forName("com.lovi.reflect.PrivateTest");

        //2. 创建实例
        Object pt = cls.newInstance();
        //3. 获取getName方法(因为是公有的，所以直接获取)
        Method getNameMethod = cls.getMethod("getName");
        //4. 得到私有属性
        Field name = cls.getDeclaredField("name");
        //5. 爆破属性
        name.setAccessible(true);
        //6. 修改私有属性(传入当前实例)
        name.set(pt, "新的小猫");
        //7. 调用公有的getName方法并输出
        System.out.println(getNameMethod.invoke(pt));

    }
}
